package E_2024;

import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/*
    VLAN 资源池
题目描述
    VLAN是一种对局域网设备进行逻辑划分的技术，为了标识不同的VLAN，引入VLAN ID(1-4094之间的整数)的概念。
    定义一个VLAN ID的资源池(下称VLAN资源池)，资源池中连续的VLAN用开始VLAN-结束VLAN表示，
    不连续的用单个整数表示，所有的VLAN用英文逗号连接起来。现在有一个VLAN资源池，
    业务需要从资源池中申请一个VLAN，需要你输出从VLAN资源池中移除申请的VLAN后的资源池。
输入描述
    第一行为字符串格式的VLAN资源池，第二行为业务要申请的VLAN，VLAN的取值范围为[1,4094]之间的0整数。
输出描述
    从输入VLAN资源池中移除申请的VLAN后字符串格式的VLAN资源池，输出要求满足题目描述中的格式并且按照VLAN从小到大升序输出。
    如果申请的VLAN不在原VLAN资源池内，输出原VLAN资源池升序排序后的字符串即可
例：https://pic2.zhimg.com/v2-c369db19ec212d17062d10d6a9117317_1440w.jpg
 */
public class E_100_54 {
    public static void main(String[] args) {
        System.out.println(ans("20-21,15,18,30,5-10",15));
        System.out.println(ans("1-10",5));
        System.out.println(ans("1-10",10));
    }
    public static String ans(String str, int target){
        String[] split = str.split(",");
        // 用数组将所有VLAN记录
        List<Integer[]> temp = new LinkedList<>();
        for (String s : split) {
            String[] chs = s.split("-");
            if (chs.length < 2) temp.add(new Integer[]{Integer.parseInt(s)});
            else {
                temp.add(new Integer[]{Integer.parseInt(chs[0]), Integer.parseInt(chs[1])});
            }
        }
        // 判断当前VLAN是否满足需要的情况
        Iterator<Integer[]> iterator = temp.iterator();
        while(iterator.hasNext()){
            Integer[] next = iterator.next();
            // 需求VLAN就是目标或目标第一个，移除或目标+1
            if (next[0] == target){
                if (next.length == 1) iterator.remove();
                else next[0]++;
                break;
                //需求VLAN在目标中间时，拆分
            }else if (next[0] < target && target < next[1]){
                int ix = next[1];
                next[1] = target - 1;
                temp.add(new Integer[]{target + 1, ix});
                break;
                //需求VLAN在目标末尾，末尾-1
            }else if (target == next[1]){
                next[1]--;
                break;
            }
        }
        temp.sort(Comparator.comparing(a->a[0]));
        StringBuilder sb = new StringBuilder();
        for (Integer[] is : temp) {
            sb.append(is[0]);
            if (is.length > 1)
                sb.append("-").append(is[1]);
            sb.append(",");
        }
        return sb.toString();
    }
}
